package com.university.mentalhealthplatform.global.rbac.security;

import com.university.mentalhealthplatform.global.rbac.model.User;
import com.university.mentalhealthplatform.global.rbac.service.entity.BaseUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.io.Serializable;

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {

    @Autowired
    private BaseUserService baseUserService;

    /**
     * 检查当前认证用户是否具有指定的权限
     *
     * @param authentication 当前认证对象
     * @param targetDomainObject 要操作的目标对象（这里不使用）
     * @param permission 需要检查的权限名称
     * @return 如果用户具有指定权限，返回 true；否则返回 false
     */
    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
        // 获取当前认证用户的用户名
        String username = authentication.getName();
        // 从数据库中获取用户信息
        User user = baseUserService.findByUsername(username).orElse(null);

        // 如果用户不存在，直接返回 false
        if (user == null) {
            return false;
        }

        // 使用 UserService 检查用户是否具有指定的权限
        String permissionName = (String) permission;
        return baseUserService.hasPermission(user, permissionName);
    }

    /**
     * 检查当前认证用户是否具有指定的权限
     *
     * @param authentication 当前认证对象
     * @param targetId 目标对象的唯一标识符（这里不使用）
     * @param targetType 目标对象的类型（这里不使用）
     * @param permission 需要检查的权限名称
     * @return 如果用户具有指定权限，返回 true；否则返回 false
     */
    @Override
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
        // 不使用此方法
        return false;
    }
}
